#include "manager.h"
#include "ui_manager.h"



manager::manager(QWidget *parent) :
    QMainWindow(parent),
     ui(new Ui::manager),
     m_btnDelegate(nullptr),
     m_model(new QStandardItemModel(this)),
     m_tcp(new tcp(this)) // 在初始化列表中创建tcp对象，并设置其父对象为当前manager对象
{
    ui->setupUi(this);
     connect(m_tcp, &tcp::dataReceived, this, &manager::handleData);
    //insert_database("jason","192.168.2.1");
    select_database();
}
//-----------------------插入数据

int manager::insert_database(QString name, QString ip)
{
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", "second");
    db.setDatabaseName("./test.db");
    if (!db.open()) {
        qDebug() << "Failed to connect to database";
        return -1;
    }
    qDebug() << "Connected to database successfully" << endl;

    QSqlQuery query(db);

    // 查询最大id
    query.exec("SELECT MAX(id) FROM users");
    if (query.next()) {
        int last_id = query.value(0).toInt();
        int id = last_id + 1;
        qDebug() << "Last id:" << last_id;
        qDebug() << "New id:" << id;
        new_id=id;
        // 插入新数据
        query.prepare("INSERT INTO users (id, name, ip) VALUES (:id, :name, :ip)");
        query.bindValue(":id", id);
        query.bindValue(":name", name);
        query.bindValue(":ip", ip);

        if (!query.exec()) {
            qDebug() << "Failed to insert data:" << query.lastError().text();
        }
    } else {
        // 如果表是空的，则插入id为1的数据
        int id = 1;
        qDebug() << "Table is empty, inserting id:" << id;

        query.prepare("INSERT INTO users (id, name, ip) VALUES (:id, :name, :ip)");
        query.bindValue(":id", id);
        query.bindValue(":name", name);
        query.bindValue(":ip", ip);

        if (!query.exec()) {
            qDebug() << "Failed to insert data:" << query.lastError().text();
        }
    }
    select_database();
    return new_id;
}



    void manager::select_database()
    {


        QSqlDatabase db;

        // 连接SQLite数据库
        db = QSqlDatabase::addDatabase("QSQLITE","second");
        db.setDatabaseName("./test.db"); // 替换为你的数据库文件路径
        if (!db.open()) {
            qDebug() << "Failed to connect to database";
            //return;
        }
        else
           qDebug()<<"连接数据库成功"<<endl;

            QSqlQuery query(db);
           query.exec("SELECT * FROM users");//select为遍历


        while(query.next()) {
            int id = query.value(0).toInt();//value（0）表示低0列
            QString name = query.value(1).toString();
            QString ip = query.value(2).toString();
            qDebug() << "ID:" << id << " Name:" << name << " ip:" << ip;

            }




        // 创建read write模型
            QSqlTableModel *model = new QSqlTableModel(this,db);
                model->setTable("users");
                if(!model->select())
                {
                    qDebug() << "数据查询失败!!" << model->lastError().text();
                    return;
                }

            int rowCount = model->rowCount();
              qDebug() << "Number of rows in the result set:" << rowCount;
                //equipment_num=rowCount;


              // 获取当前列数
              int currentColumnCount = model->columnCount();

              // 在当前列数之后插入新列
              model->insertColumn(currentColumnCount);

              // 设置新列的标题
              model->setHeaderData(currentColumnCount, Qt::Horizontal, QObject::tr("button action"));



              // 必须要设置此项，否则样式表的hover无法生效
                  ui->equipment_list->setMouseTracking(true);
                  // 构造函数中传入按钮列表即可添加任意个按钮
                  m_btnDelegate = new QMyTableViewBtnDelegate(QStringList()<<"编辑"<<"删除", this);
                  // 为指定列设置代理
                  ui->equipment_list->setItemDelegateForColumn(3, m_btnDelegate);


              // 连接信号槽，根据需要添加
              connect(m_btnDelegate, &QMyTableViewBtnDelegate::editData, this, [=](const QModelIndex &index){
                  QMessageBox::information(this, "提示", QString("编辑第 %1 行数据").arg(index.row()+1));
              });//editdata是自定义的信号
           /*   connect(m_btnDelegate, &QMyTableViewBtnDelegate::deleteData, this, [=](const QModelIndex &index){
                  QMessageBox::information(this, "提示", QString("删除第 %1 行数据").arg(index.row()+1));
              });
    */


              connect(m_btnDelegate, &QMyTableViewBtnDelegate::deleteData, this, [=](const QModelIndex &index){
                  // 获取要删除的行的id
                  QVariant idValue = model->data(model->index(index.row(), 0)); // 假设 "id" 列是查询结果的第一列
                  if (!idValue.isValid() || idValue.isNull()) {
                      QMessageBox::warning(this, "警告", "无法获取要删除的行的ID。");
                      return;
                  }

                  int id = idValue.toInt(); // 将QVariant转换为int，假设ID是整数类型

                  // 准备并执行删除语句
                  QSqlQuery query(db);
                  query.prepare("DELETE FROM users WHERE id = :id"); // 假设表名为 "users"
                  query.bindValue(":id", id);
                  if (!query.exec()) {
                      QMessageBox::critical(this, "错误", "删除数据失败：" + query.lastError().text());
                      return;
                  }

                    select_database();


                  // 可选：通知用户删除成功
                  QMessageBox::information(this, "提示", QString("已删除ID为 %1 的行。").arg(id));
              });



            ui->equipment_list->setModel(model);
            ui->equipment_list->resizeColumnsToContents(); // 调整列宽度使数据能够完全显示


}

manager::~manager()
{
    delete ui;
    // 不需要手动删除tableModel，因为它是this的子对象
}




//------------------------auto_button

void manager::onTableBtnClicked()
{
    QPushButton *button = (QPushButton *)sender();
    qDebug() << button->property("id").toInt() << endl;
    qDebug() << button->property("name").toString() << endl;
    qDebug() << button->property("status").toString() << endl;
}




void manager::handleData(const QString &data,QString name) {
    qDebug() << "Data received in manager:" << data<<"name:"<<name;
    // 在这里处理接收到的数据
    check_ip(data,name);



}

void manager::check_ip(QString new_ipv4,QString name)
{

    QSqlDatabase db;
    bool ipv4_double=true;
    // 连接SQLite数据库
    db = QSqlDatabase::addDatabase("QSQLITE","second");
    db.setDatabaseName("./test.db"); // 替换为你的数据库文件路径
    if (!db.open()) {
        qDebug() << "Failed to connect to database";
        //return;
    }else
        qDebug()<<"连接数据库成功"<<endl;
    QSqlQuery query(db);


   query.exec("SELECT * FROM users");//select为遍历

   int ipId = -1; // 用于存储找到的 IP 的编号（主键），初始化为无效值


   while(query.next()) {
       QString ip = query.value(2).toString(); // 假设 IP 地址是第三列（索引从0开始）
       qDebug() << "ip:" << ip;
       int result = new_ipv4.compare(ip, Qt::CaseInsensitive);
       if(result == 0) {
           // 如果找到相同的 IP，获取其编号（主键）
           ipId = query.value(0).toInt(); // 假设编号（主键）是第一列
           ipv4_double = false; // IP 不重复
           break;
       }
   }

   if(ipv4_double) { // 如果 IP 没重复，则直接写入数据库
       // 假设 insert_database 是一个函数，用于将新 IP 插入数据库，并返回新插入的记录的编号
       ipId = insert_database(name, new_ipv4);
       qDebug() << "success insert";
   }

   // 无论 IP 是否重复，现在都有 ipId 的值（如果是新插入的，则是新编号；如果是已存在的，则是找到的编号）
   QString text = QString("%1").arg(ipId);
   qDebug() << text;
   m_tcp->socket->write(text.toUtf8().data());

   if (ipv4_double) {

       qDebug() << "New IP inserted or found in database";
   } else {
       qDebug() << "This IP is already exist";
   }

}












void manager::on_pushButton_clicked()
{
    manager_product *product_show=new manager_product(this);
    product_show->show();
    this->hide();
}
